package com.cino.annotation;

import com.cino.enums.StoreType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 审计日志注解
 * 用于标记需要记录审计日志的方法
 * 
 * 日志输出格式：
 * - CREATE: 新增 + title字段 + 【title值】
 * - UPDATE: title字段 从 【旧值】 编辑为 【新值】
 * - DELETE: 删除 + title字段 + 【title值】
 *
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuditLog {
    
    /**
     * 操作类型
     */
    OperationType operationType();
    
    /**
     * 标题字段（必填）
     * 用于日志输出中的描述，如"用户信息"、"订单信息"等
     * 不能为空，必须硬编码指定
     */
    String title();
    
    /**
     * 需要审计的字段名（Java字段名）
     * 所有操作都需要填写，且必须有值
     * - CREATE/DELETE: 用于提取字段值显示在日志中，如【张三】
     * - UPDATE: 用于字段对比，显示变更内容
     */
    String[] includeFields() default {};
    
    /**
     * 自定义审计日志保存方法（全路径格式）
     * 如有指定，则使用自定义方法保存审计日志，而不是默认的保存逻辑
     * 
     * 格式：com.package.ClassName.methodName
     * 方法签名必须是：public void methodName(Long objectId, String content, String operationType, Object[] methodArgs, Object returnValue)
     * 目标类必须是Spring管理的bean
     * 
     * 参数说明：
     * - objectId: 操作对象ID
     * - content: 审计日志内容
     * - operationType: 操作类型（CREATE、UPDATE等）
     * - methodArgs: 原方法入参数组
     * - returnValue: 原方法返回值
     * 
     * 示例：
     * targetMethod = "com.cino.demos.service.CustomLogService.saveUserCreateLog"
     * 
     * 注意：原业务方法会正常执行，只是日志保存使用自定义逻辑
     */
    String targetMethod() default "";
    
    /**
     * 自定义存储表名（可选）
     * 如果指定了此字段，审计日志将保存到指定的表中，而不是默认的audit_log表
     * 
     * 注意：
     * 1. 目标表的结构必须与audit_log表一致
     * 2. 只有在使用默认的异步日志保存方法时才生效
     * 3. 如果同时指定了targetMethod，此字段将被忽略
     * 
     * 示例：
     * storageTable = "user_audit_log"  // 将日志保存到user_audit_log表
     */
    String storageTable() default "";
    
    /**
     * 存储方式（可选）
     * 指定审计日志的存储策略，支持mysql和local两种方式
     * 
     * 优先级：
     * 1. 注解中的storeType配置优先级最高
     * 2. application.yml中的配置为默认配置
     * 
     * 存储方式说明：
     * - 不指定（数组为空）: 使用application.yml配置或默认为mysql
     * - StoreType.MYSQL: 强制使用MySQL数据库存储
     * - StoreType.LOCAL: 强制使用本地文件存储，路径：/data/admin/log/
     * 
     * 示例：
     * storeType = {StoreType.LOCAL}  // 强制使用本地文件存储
     * storeType = {}                 // 使用配置文件设置或默认mysql
     */
    StoreType[] storeType() default {};
    
    /**
     * 操作类型枚举
     */
    enum OperationType {
        CREATE("创建"),
        UPDATE("更新"),
        DELETE("删除");

        private final String description;
        
        OperationType(String description) {
            this.description = description;
        }
        
        public String getDescription() {
            return description;
        }
    }
}
